package com.controller;

import java.io.File;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;

import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.hibernate.criterion.Restrictions;
import org.hibernate.internal.SessionFactoryImpl;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.jsf.FacesContextUtils;

import com.builder.ClienteBuilder;
import com.builder.FamiliaBuilder;
import com.builder.MarcaBuilder;
import com.builder.OrdenDeCompraBuilder;
import com.builder.OrdenDeCompraDetalleBuilder;
import com.builder.ProductoBuilder;
import com.builder.ProductoCodigoBuilder;
import com.builder.ProveedorBuilder;
import com.builder.RemitoBuilder;
import com.builder.StockBuilder;
import com.builder.TarifarioBuilder;
import com.builder.UsuarioBuilder;
import com.dao.BaseModelDAO;
import com.model.Cliente;
import com.model.Familia;
import com.model.Marca;
import com.model.MovimientoStock;
import com.model.OrdenDeCompra;
import com.model.Parametro;
import com.model.Producto;
import com.model.ProductoCodigo;
import com.model.Proveedor;
import com.model.Remito;
import com.model.Stock;
import com.model.Tarifario;
import com.model.Usuario;
import com.model.composite.Contacto;
import com.query.OrdenDeCompraQuery;
import com.query.TarifarioQuery;
import com.type.EstadoEnum;
import com.type.RolEnum;
import com.type.TipoMovimientoStockEnum;
import com.type.TipoTarifarioEnum;
import com.util.DateUtil;
import com.util.JSFUtil;
import com.util.MailServiceImpl;
import com.view.ClienteView;
import com.view.FamiliaView;
import com.view.MarcaView;
import com.view.OrdenDeCompraDetalleView;
import com.view.OrdenDeCompraView;
import com.view.ProductoCodigoView;
import com.view.ProductoPrecioView;
import com.view.ProductoView;
import com.view.ProveedorView;
import com.view.RemitoDetalleView;
import com.view.RemitoView;
import com.view.StockView;
import com.view.TarifarioView;
import com.view.UsuarioView;

@ManagedBean
@ViewScoped
@SuppressWarnings("serial")
public class OrdenDeCompraController extends PaginableController<OrdenDeCompra> {

	private final String empresa = "empresa";
	private final String direccionEmpresa = "direccionEmpresa";
	private final String localidadEmpresa = "localidadEmpresa";
	private final String telefonoEmpresa = "telefonoEmpresa";
	private final String asuntoOC = "asuntoMailOC";
	private final String cuerpoOC = "cuerpoMailOC";

	private Logger log = Logger.getLogger(OrdenDeCompraController.class);
	private OrdenDeCompra ordenDeCompra;
	private OrdenDeCompraQuery ordenDeCompraQuery;

	private List<ProveedorView> listaDeProveedores;
	private List<ClienteView> listaDeClientes;
	private List<ProductoView> listaDeProductos;
	private List<FamiliaView> listaDeFamilia;
	private List<MarcaView> listaDeMarca;
	private ProveedorView proveedorView;
	private ProductoView productoView;
	private Producto prodcutoView;
	private TarifarioView tarifarioView;
	private ProductoPrecioView productoPrecio;
	private StockView stockView;
	private ProductoCodigoView productoCodigoView;
	private List<OrdenDeCompraDetalleView> ordenDeCompraDetalle;
	private RemitoView remitoView;
	private FamiliaView familiaSeleccionada;
	private MarcaView marcaSeleccionada;

	private Double totalCargaProducto;

	private BaseModelDAO<OrdenDeCompra> daoOrdenDeCompra;
	private BaseModelDAO<Parametro> daoParametro;
	private BaseModelDAO<Proveedor> daoProveedor;
	private BaseModelDAO<Cliente> daoCliente;
	private BaseModelDAO<ProductoCodigo> daoProductoCodigo;
	private BaseModelDAO<Producto> daoProducto;
	private BaseModelDAO<Tarifario> daoTarifario;
	private BaseModelDAO<Stock> daoStock;
	private BaseModelDAO<Usuario> daoUsuario;
	private BaseModelDAO<Remito> daoRemito;
	private BaseModelDAO<Familia> daoFamilia;
	private BaseModelDAO<Marca> daoMarca;

	private MailServiceImpl mailService;

	private String labelButtonAddUpdate;

	private OrdenDeCompraView ordenDeCompraView;

	private String disabled;
	private Double stockCantidad;

	private boolean addEditDispatch;
	private boolean addEditRecepcion;
	private boolean info;
	private boolean list;

	private String idSeleccionado;

	private BigDecimal total;
	private BigDecimal totalRecepcionado;

	@ManagedProperty("#{proveedorBuilder}")
	private ProveedorBuilder proveedorBuilder;

	@ManagedProperty("#{ordenDeCompraBuilder}")
	private OrdenDeCompraBuilder ordenDeCompraBuilder;

	@ManagedProperty("#{ordenDeCompraDetalleBuilder}")
	private OrdenDeCompraDetalleBuilder ordenDeCompraDetalleBuilder;

	@ManagedProperty("#{productoCodigoBuilder}")
	private ProductoCodigoBuilder productoCodigoBuilder;

	@ManagedProperty("#{productoBuilder}")
	private ProductoBuilder productoBuilder;

	@ManagedProperty("#{tarifarioBuilder}")
	private TarifarioBuilder tarifarioBuilder;

	@ManagedProperty("#{stockBuilder}")
	private StockBuilder stockBuilder;

	@ManagedProperty("#{remitoBuilder}")
	private RemitoBuilder remitoBuilder;

	@ManagedProperty("#{usuarioBuilder}")
	private UsuarioBuilder usuarioBuilder;

	@ManagedProperty("#{clienteBuilder}")
	private ClienteBuilder clienteBuilder;

	@ManagedProperty("#{usuarioView}")
	private UsuarioView usuarioView;

	@ManagedProperty("#{familiaBuilder}")
	private FamiliaBuilder familiaBuilder;

	@ManagedProperty("#{marcaBuilder}")
	private MarcaBuilder marcaBuilder;

	@SuppressWarnings("unchecked")
	public OrdenDeCompraController() {
		try {
			daoOrdenDeCompra = (BaseModelDAO<OrdenDeCompra>) FacesContextUtils
					.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("ordenDeCompraDAO");

			daoRemito = (BaseModelDAO<Remito>) FacesContextUtils
					.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("remitoDAO");

			daoProveedor = (BaseModelDAO<Proveedor>) FacesContextUtils
					.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("proveedorDAO");

			daoProductoCodigo = (BaseModelDAO<ProductoCodigo>) FacesContextUtils
					.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("productoCodigoDAO");

			daoProducto = (BaseModelDAO<Producto>) FacesContextUtils
					.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("productoDAO");

			daoTarifario = (BaseModelDAO<Tarifario>) FacesContextUtils
					.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("tarifarioDAO");

			daoStock = (BaseModelDAO<Stock>) FacesContextUtils
					.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("stockDAO");

			daoParametro = (BaseModelDAO<Parametro>) FacesContextUtils
					.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("parametroDAO");

			mailService = (MailServiceImpl) FacesContextUtils
					.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("mailService");

			daoUsuario = (BaseModelDAO<Usuario>) FacesContextUtils
					.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("usuarioDAO");

			daoFamilia = (BaseModelDAO<Familia>) FacesContextUtils
					.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("familiaDAO");

			daoMarca = (BaseModelDAO<Marca>) FacesContextUtils
					.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("marcaDAO");

			daoCliente = (BaseModelDAO<Cliente>) FacesContextUtils
					.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("clienteDAO");

			ordenDeCompraQuery = new OrdenDeCompraQuery();
			addEdit = false;
			info = false;
			list = true;

			proveedorView = new ProveedorView();
			familiaSeleccionada = new FamiliaView();
			marcaSeleccionada = new MarcaView();

			total = BigDecimal.ZERO;
			totalRecepcionado = BigDecimal.ZERO;

		} catch (Throwable e) {
			log.error("Error al inicializar la clase StockController", e);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al realizar la operacion", ""));
		}
	}

	@PostConstruct
	private void init() {
		listaDeProveedores = new ArrayList<ProveedorView>();
		listaDeProveedores.addAll(proveedorBuilder.toView(daoProveedor
				.getList()));

		listaDeClientes = new ArrayList<ClienteView>();
		listaDeClientes.addAll(clienteBuilder.toView(daoCliente.getList()));

		listaDeMarca = new ArrayList<MarcaView>();
		listaDeMarca.addAll(marcaBuilder.toView(daoMarca.getList()));

		listaDeFamilia = new ArrayList<FamiliaView>();
		listaDeFamilia.addAll(familiaBuilder.toView(daoFamilia.getList()));
	}

	public void query(ActionEvent event) {
		// si es un cliente el que ve sólo muestro lo del cliente (no puede ver
		// el resto)
		if (getUsuario().getCliente() != null) {
			ordenDeCompraQuery.setClienteID(getUsuario().getCliente().getID());
		}
		loadList();
	}

	public void edit(Long id, String disabled) {

		this.productoView = new ProductoView();
		this.productoCodigoView = new ProductoCodigoView();
		this.productoPrecio = new ProductoPrecioView();
		this.stockView = new StockView();
		this.totalCargaProducto = 0D;

		this.labelButtonAddUpdate = "Modificar Orden De Compra";

		addEdit = true;
		info = false;
		list = false;
		this.disabled = disabled;
		addEditDispatch = false;
		addEditRecepcion = false;

		try {

			// obtener usuario conectado
			Usuario usuario = getUsuario();

			ordenDeCompraView = ordenDeCompraBuilder.toView(daoOrdenDeCompra
					.findInitialize(id));
			this.ordenDeCompraDetalle = new ArrayList<OrdenDeCompraDetalleView>();
			this.ordenDeCompraDetalle.addAll(ordenDeCompraView
					.getListaDetalleOrdenDeCompraView());

			listaDeProductos = new ArrayList<ProductoView>();
			Proveedor unProveedor = daoProveedor
					.findInitialize(ordenDeCompraView.getProveedorView()
							.getId());
			for (ProductoCodigo lista : unProveedor.getListaProductoCodigo()) {
				listaDeProductos
						.add(productoBuilder.toView(lista.getProducto()));
			}

		} catch (Throwable e) {
			log.error("Error al guardar", e);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al realizar la operacion", ""));
		}

	}

	@Override
	public void add(ActionEvent event) {

		this.productoView = new ProductoView();
		this.productoCodigoView = new ProductoCodigoView();
		this.productoPrecio = new ProductoPrecioView();
		this.stockView = new StockView();
		this.totalCargaProducto = 0D;
		this.ordenDeCompraView = new OrdenDeCompraView();
		// La fecha de la orden de compra la pone el sistema
		this.ordenDeCompraView.setFechaOrdenDeCompra(DateUtil
				.getFirstTime(new Date()));

		this.labelButtonAddUpdate = "Crear Orden De Compra";
		ordenDeCompraDetalle = new ArrayList<OrdenDeCompraDetalleView>();

		// obtener usuario conectado
		Usuario usuario = getUsuario();

		// determinar el tipo de proveedor dependiendo de los roles
		String tipoProveedor = "I"; // cliente
		for (RolEnum rolEnum : usuario.getRolEnumList()) {
			if (rolEnum.getLabel().startsWith("Central")) {
				tipoProveedor = "E"; // cemtral
				break;
			}
		}

		// filtro los proveedores a mostrar en el combo, dependiendo del tipo de
		// usuario conectado
		List<ProveedorView> borrar = new ArrayList<ProveedorView>();
		listaDeProveedores = new ArrayList<ProveedorView>();
		listaDeProveedores.addAll(proveedorBuilder.toView(daoProveedor
				.getList()));
		for (ProveedorView proveedorView : listaDeProveedores) {
			if (!proveedorView.getTipoProveedor().equalsIgnoreCase(
					tipoProveedor)) {
				borrar.add(proveedorView);
			}
		}
		if (!borrar.isEmpty()) {
			listaDeProveedores.removeAll(borrar);
		}

		addEdit = true;
		this.disabled = "false";
		addEditDispatch = false;
		addEditRecepcion = false;
		info = false;
		list = false;

	}

	public int cuantosRemitosTieneLaOrdenDeCompras(Long ordenDeCompraId) {
		int retorno = 0;

		OrdenDeCompra unaOC = daoOrdenDeCompra.findInitialize(ordenDeCompraId);

		if (unaOC.getListaDeRemitos() != null) {
			retorno = unaOC.getListaDeRemitos().size();
		} else {
			retorno = 0;
		}

		return retorno;
	}

	public boolean estanTodosLosRemitosRecepcionados(Long ordenDeCompraId) {
		boolean retorno = true;

		OrdenDeCompra unaOC = daoOrdenDeCompra.findInitialize(ordenDeCompraId);

		if (unaOC.getListaDeRemitos() != null) {
			for (Remito remito : unaOC.getListaDeRemitos()) {
				if (!remito.getEstado().equalsIgnoreCase("RECEPCIONADO")) {
					retorno = false;
					break;
				}
			}
		} else {
			retorno = false;
		}

		return retorno;
	}

	public boolean estanTodosLosRemitosAprobados(Long ordenDeCompraId) {
		boolean retorno = true;

		OrdenDeCompra unaOC = daoOrdenDeCompra.findInitialize(ordenDeCompraId);

		if (unaOC.getListaDeRemitos() != null
				&& unaOC.getListaDeRemitos().size() != 0) {
			for (Remito remito : unaOC.getListaDeRemitos()) {
				if (!remito.getEstado().equalsIgnoreCase("APROBADO")) {
					retorno = false;
					break;
				}
			}
		} else {
			retorno = false;
		}

		return retorno;
	}

	public boolean puedoRecepcionMercaderia(Long ordenDeCompraId) {
		boolean retorno = false;

		// OrdenDeCompra unaOC =
		// daoOrdenDeCompra.findInitialize(ordenDeCompraId);
		// Usuario unUsuario = getUsuario();
		//
		// Long oc = 0L;
		// if (unaOC.getCliente()==null){
		// oc = null;
		// }
		// if (unaOC.getCliente()!=null){
		// oc = unaOC.getCliente().getID();
		// }
		// Long user = 0L;
		// if (unUsuario.getCliente()==null){
		// user = null;
		// }
		// if (unUsuario.getCliente()!=null){
		// user = unUsuario.getCliente().getID();
		// }
		//
		// if (oc==user){
		// retorno = true;
		// }else{
		// retorno = false;
		// }

		return retorno;
	}

	public Usuario getUsuario() {
		String currentUserName = "";
		Authentication authentication = SecurityContextHolder.getContext()
				.getAuthentication();
		if (!(authentication instanceof AnonymousAuthenticationToken)) {
			currentUserName = authentication.getName();
		}
		Usuario unUsuario = daoUsuario.findBy(currentUserName);
		return unUsuario;
	}

	@Override
	public void save(ActionEvent event) {

		Long numeroOrdenCompra = 1l;
		try {

			if (ordenDeCompraDetalle.isEmpty()) {
				FacesContext
						.getCurrentInstance()
						.addMessage(
								null,
								new FacesMessage(
										FacesMessage.SEVERITY_ERROR,
										"El detalle de la orden de compra no puede estar vacio.",
										""));
			} else {
				ordenDeCompraView
						.setListaDetalleOrdenDeCompraView(ordenDeCompraDetalle);
				ordenDeCompraView.setEstado("NUEVA");
				ordenDeCompraView.setProveedorView(proveedorBuilder
						.toView(daoProveedor.findFULL(ordenDeCompraView
								.getProveedorView().getId())));
				// pongo el total de la orden de compra
				ordenDeCompraView.setTotal(getGranTotalPrecio());

				if (ordenDeCompraView.getProveedorView().getTipoProveedor()
						.equalsIgnoreCase("I")) {
					ordenDeCompraView.setClienteView(clienteBuilder
							.toView(getUsuario().getCliente()));

				} else {
					ordenDeCompraView.setClienteView(null);
				}

				ordenDeCompra = ordenDeCompraBuilder
						.toDomain(ordenDeCompraView);

				if (ordenDeCompra.getID() != null) {
					daoOrdenDeCompra.edit(ordenDeCompra);
					addEdit = false;
					info = false;
					list = true;

					JSFUtil.saveMessage(
							"Se modificó correctamente la orden de compra "
									+ ordenDeCompra.getNumeroOrdenDeCompra(),
							FacesMessage.SEVERITY_INFO);
				} else {
					// obtengo la orden de compra con mayor numeración
					OrdenDeCompra ordenComrpraAnterior = daoOrdenDeCompra
							.get(1);
					if (ordenComrpraAnterior != null) {
						numeroOrdenCompra = ordenComrpraAnterior
								.getNumeroOrdenDeCompra() + 1;
					}

					// pongo el número de orden de compra teniendo en cuenta el
					// número más antiguo
					ordenDeCompra.setNumeroOrdenDeCompra(numeroOrdenCompra);
					ordenDeCompra.setFechaCreadaOrdenDeCompra(Calendar
							.getInstance().getTime());
					daoOrdenDeCompra.save(ordenDeCompra);

					JSFUtil.saveMessage(
							"Se agregó correctamente la orden de compra "
									+ ordenDeCompra.getNumeroOrdenDeCompra(),
							FacesMessage.SEVERITY_INFO);
				}

				if (!addEdit) {
					loadList();
				}

				addEdit = false;
				addEditDispatch = false;
				addEditRecepcion = false;
				info = false;
				list = true;

				lazyDM = null;
				clear();

			}

		} catch (Throwable e) {
			log.error("Error al guardar", e);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al realizar la operacion", ""));
		}
	}

	public void info(Long id) {

		this.productoView = new ProductoView();
		this.productoCodigoView = new ProductoCodigoView();
		this.productoPrecio = new ProductoPrecioView();
		this.stockView = new StockView();
		this.totalCargaProducto = 0D;

		this.labelButtonAddUpdate = "Modificar Orden De Compra";

		addEdit = false;
		info = true;
		list = false;
		addEditDispatch = false;
		addEditRecepcion = false;

		try {

			// obtener usuario conectado
			Usuario usuario = getUsuario();

			ordenDeCompraView = ordenDeCompraBuilder.toView(daoOrdenDeCompra
					.findInitialize(id));
			this.ordenDeCompraDetalle = new ArrayList<OrdenDeCompraDetalleView>();
			this.ordenDeCompraDetalle.addAll(ordenDeCompraView
					.getListaDetalleOrdenDeCompraView());

			listaDeProductos = new ArrayList<ProductoView>();
			Proveedor unProveedor = daoProveedor
					.findInitialize(ordenDeCompraView.getProveedorView()
							.getId());
			for (ProductoCodigo lista : unProveedor.getListaProductoCodigo()) {
				listaDeProductos
						.add(productoBuilder.toView(lista.getProducto()));
			}

		} catch (Throwable e) {
			log.error("Error al guardar", e);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al realizar la operacion", ""));
		}

	}

	@Override
	public void cancel(ActionEvent event) {
		addEdit = false;
		addEditDispatch = false;
		addEditRecepcion = false;
		info = false;
		list = true;

		lazyDM = null;
		clear();
	}

	public void prepararAutorizacion() {

		addEdit = false;
		addEditDispatch = false;
		addEditRecepcion = false;
		info = false;
		list = false;

		try {

			ordenDeCompraView = ordenDeCompraBuilder.toView(daoOrdenDeCompra
					.findInitialize(Long.parseLong(idSeleccionado)));
			this.ordenDeCompraDetalle = new ArrayList<OrdenDeCompraDetalleView>();
			this.ordenDeCompraDetalle.addAll(ordenDeCompraView
					.getListaDetalleOrdenDeCompraView());

			listaDeProductos = new ArrayList<ProductoView>();
			Proveedor unProveedor = daoProveedor
					.findInitialize(ordenDeCompraView.getProveedorView()
							.getId());
			for (ProductoCodigo lista : unProveedor.getListaProductoCodigo()) {
				listaDeProductos
						.add(productoBuilder.toView(lista.getProducto()));
			}

		} catch (Throwable e) {
			log.error("Error al guardar", e);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al realizar la operacion", ""));
		}

	}

	public void autorizar(ActionEvent event) {

		try {

			ordenDeCompraView.setEstado("AUTORIZADA");
			ordenDeCompra = ordenDeCompraBuilder.toDomain(ordenDeCompraView);

			ordenDeCompra.setFechaAutorizadaOrdenDeCompra(Calendar
					.getInstance().getTime());
			daoOrdenDeCompra.edit(ordenDeCompra);
			addEdit = false;
			addEditDispatch = false;
			addEditRecepcion = false;
			info = false;
			list = true;

			JSFUtil.saveMessage("Elemento actualizado con exito",
					FacesMessage.SEVERITY_INFO);
			if (!addEdit) {
				loadList();
			}

		} catch (Throwable e) {
			log.error("Error al actualizar", e);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al realizar la operacion", ""));
		}

	}

	public void prepararCerrar() {

		addEdit = false;
		addEditDispatch = false;
		addEditRecepcion = false;
		info = false;
		list = true;

		try {

			ordenDeCompraView = ordenDeCompraBuilder.toView(daoOrdenDeCompra
					.findInitialize(Long.parseLong(idSeleccionado)));
			this.ordenDeCompraDetalle = new ArrayList<OrdenDeCompraDetalleView>();
			this.ordenDeCompraDetalle.addAll(ordenDeCompraView
					.getListaDetalleOrdenDeCompraView());

			listaDeProductos = new ArrayList<ProductoView>();
			Proveedor unProveedor = daoProveedor
					.findInitialize(ordenDeCompraView.getProveedorView()
							.getId());
			for (ProductoCodigo lista : unProveedor.getListaProductoCodigo()) {
				listaDeProductos
						.add(productoBuilder.toView(lista.getProducto()));
			}

		} catch (Throwable e) {
			log.error("Error al guardar", e);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al realizar la operacion", ""));
		}

	}

	public void cerrarOrdenDeCompra(ActionEvent event) {

		try {

			ordenDeCompraView.setEstado("CERRADA");
			ordenDeCompra = ordenDeCompraBuilder.toDomain(ordenDeCompraView);

			ordenDeCompra.setFechaCierreOrdenDeCompra(Calendar.getInstance()
					.getTime());
			daoOrdenDeCompra.edit(ordenDeCompra);
			addEdit = false;
			addEditDispatch = false;
			addEditRecepcion = false;
			info = false;
			list = true;

			JSFUtil.saveMessage("Elemento actualizado con exito",
					FacesMessage.SEVERITY_INFO);
			if (!addEdit) {
				loadList();
			}

		} catch (Throwable e) {
			log.error("Error al actualizar", e);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al realizar la operacion", ""));
		}

	}

	@SuppressWarnings({ "rawtypes", "unchecked", "deprecation" })
	public void print(ActionEvent event) {

		try {

			HttpServletResponse response = (HttpServletResponse) FacesContext
					.getCurrentInstance().getExternalContext().getResponse();
			ServletContext sc = (ServletContext) FacesContext
					.getCurrentInstance().getExternalContext().getContext();
			String pathReal = sc.getRealPath("/");

			OrdenDeCompra ordenDeCompra = ((OrdenDeCompra) lazyDM.getRowData());

			File file = null;
			// verifico si es una OC de cliente o proveedor
			// si es de cliente el cliente es el cliente sino el cliente es el
			// proveedor
			if (ordenDeCompra.getCliente() != null
					&& ordenDeCompra.getCliente().getID() != null) {
				file = new File(pathReal + File.separator
						+ "resources\\reports\\OrdenDeCompraCliente.jasper");
			} else {
				file = new File(pathReal + File.separator
						+ "resources\\reports\\OrdenDeCompra.jasper");
			}

			JasperReport jasperReport = (JasperReport) JRLoader
					.loadObject(file);

			// parametros
			Map parameters = new HashMap();
			parameters.put("idOC", ordenDeCompra.getID().intValue());
			parameters.put("imagenLogo", pathReal + File.separator
					+ "resources\\images\\logo.jpg");

			// datos de la empresa ( están configurados en la pantalla de
			// parámetros
			String empresaParametro = "";
			try {
				empresaParametro = daoParametro.get(empresa).getValor();
			} catch (Throwable t) {
			}

			String direccionEmpresaParametro = "";
			try {
				direccionEmpresaParametro = daoParametro.get(direccionEmpresa)
						.getValor();
			} catch (Throwable t) {
			}

			String localidadEmpresaParametro = "";
			try {
				localidadEmpresaParametro = daoParametro.get(localidadEmpresa)
						.getValor();
			} catch (Throwable t) {
			}

			String telefonoEmpresaParametro = "";
			try {
				telefonoEmpresaParametro = daoParametro.get(telefonoEmpresa)
						.getValor();
			} catch (Throwable t) {
			}

			parameters.put("empresa", empresaParametro);
			parameters.put("direccion", direccionEmpresaParametro);
			parameters.put("localidad", localidadEmpresaParametro);
			parameters.put("telefono", telefonoEmpresaParametro);

			SessionFactoryImpl objetc = (SessionFactoryImpl) FacesContextUtils
					.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("sessionFactory");

			JasperPrint print = JasperFillManager.fillReport(jasperReport,
					parameters, objetc.getJdbcServices()
							.getConnectionProvider().getConnection());

			response.setContentType("application/pdf");
			response.addHeader("Content-Disposition",
					"attachment; filename=OrdenDeCompra.pdf");

			JasperExportManager.exportReportToPdfStream(print,
					response.getOutputStream());

			FacesContext.getCurrentInstance().responseComplete();
		} catch (Throwable e) {
			log.error("Error al exportar la orden de compra a PDF: ", e);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al exportar la orden de compra", ""));
		}

	}

	@SuppressWarnings({ "rawtypes", "unchecked", "deprecation" })
	public void email(ActionEvent event) {

		try {

			OrdenDeCompra ordenDeCompra = ((OrdenDeCompra) lazyDM.getRowData());

			// obtengo los contactos del proveedor
			List<String> listaContactos = new ArrayList<String>();
			for (Contacto contacto : ordenDeCompra.getProveedor()
					.getListaContactos()) {

				if (contacto.getMail() != null
						&& !"".equals(contacto.getMail())) {
					listaContactos.add(contacto.getMail());
				}
			}

			if (listaContactos.size() > 0) {

				// busco los parametros configurados
				String subject = "";
				try {
					subject = daoParametro.get(asuntoOC).getValor();
				} catch (Throwable t) {
				}

				String cuerpo = "";
				try {
					cuerpo = daoParametro.get(cuerpoOC).getValor();
				} catch (Throwable t) {
				}

				ServletContext sc = (ServletContext) FacesContext
						.getCurrentInstance().getExternalContext().getContext();
				String pathReal = sc.getRealPath("/");

				File file = null;
				// verifico si es una OC de cliente o proveedor
				// si es de cliente el cliente es el cliente sino el cliente es
				// el proveedor
				if (ordenDeCompra.getCliente() != null
						&& ordenDeCompra.getCliente().getID() != null) {
					file = new File(pathReal + File.separator
							+ "resources\\reports\\OrdenDeCompraCliente.jasper");
				} else {
					file = new File(pathReal + File.separator
							+ "resources\\reports\\OrdenDeCompra.jasper");
				}

				JasperReport jasperReport = (JasperReport) JRLoader
						.loadObject(file);

				// parametros
				Map parameters = new HashMap();
				parameters.put("idOC", ordenDeCompra.getID().intValue());
				parameters.put("imagenLogo", pathReal + File.separator
						+ "resources\\images\\logo.jpg");

				// datos de la empresa ( están configurados en la pantalla de
				// parámetros
				String empresaParametro = "";
				try {
					empresaParametro = daoParametro.get(empresa).getValor();
				} catch (Throwable t) {
				}

				String direccionEmpresaParametro = "";
				try {
					direccionEmpresaParametro = daoParametro.get(
							direccionEmpresa).getValor();
				} catch (Throwable t) {
				}

				String localidadEmpresaParametro = "";
				try {
					localidadEmpresaParametro = daoParametro.get(
							localidadEmpresa).getValor();
				} catch (Throwable t) {
				}

				String telefonoEmpresaParametro = "";
				try {
					telefonoEmpresaParametro = daoParametro
							.get(telefonoEmpresa).getValor();
				} catch (Throwable t) {
				}

				parameters.put("empresa", empresaParametro);
				parameters.put("direccion", direccionEmpresaParametro);
				parameters.put("localidad", localidadEmpresaParametro);
				parameters.put("telefono", telefonoEmpresaParametro);

				SessionFactoryImpl objetc = (SessionFactoryImpl) FacesContextUtils
						.getWebApplicationContext(
								FacesContext.getCurrentInstance()).getBean(
								"sessionFactory");

				JasperPrint print = JasperFillManager.fillReport(jasperReport,
						parameters, objetc.getJdbcServices()
								.getConnectionProvider().getConnection());

				JasperExportManager.exportReportToPdfFile(print,
						"OrdenDeCompra.pdf");

				File archivo = new File("OrdenDeCompra.pdf");

				mailService.send(listaContactos, subject, cuerpo, archivo);

				// borro el archivo
				FileUtils.forceDelete(archivo);
			}

		} catch (Throwable e) {
			log.error("Error al enviar la OC al proveedor: ", e);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al enviar la orden de compra", ""));
		}

	}

	public void asociarRemitos(Long id, String disabled) {

		this.productoView = new ProductoView();
		this.productoCodigoView = new ProductoCodigoView();
		this.productoPrecio = new ProductoPrecioView();
		this.stockView = new StockView();
		this.totalCargaProducto = 0D;
		this.remitoView = new RemitoView();

		addEdit = false;
		this.disabled = disabled;
		addEditDispatch = true;
		addEditRecepcion = false;
		info = false;
		list = false;

		try {

			ordenDeCompraView = ordenDeCompraBuilder.toView(daoOrdenDeCompra
					.findInitialize(id));
			// coloco el número de remito. Ahora no se ingresa por pantalla.
			if (ordenDeCompraView.getListaDeRemitos() == null) {
				remitoView.setNumeroRemito(1l);
			} else {
				remitoView.setNumeroRemito(ordenDeCompraView
						.getListaDeRemitos().size() + 1l);
			}
			// La fecha del remito la pone el sistema
			remitoView.setFechaRemito(DateUtil.getFirstTime(new Date()));
			this.ordenDeCompraDetalle = new ArrayList<OrdenDeCompraDetalleView>();
			this.ordenDeCompraDetalle.addAll(ordenDeCompraView
					.getListaDetalleOrdenDeCompraView());

			listaDeProductos = new ArrayList<ProductoView>();
			Proveedor unProveedor = daoProveedor
					.findInitialize(ordenDeCompraView.getProveedorView()
							.getId());
			for (ProductoCodigo lista : unProveedor.getListaProductoCodigo()) {
				listaDeProductos
						.add(productoBuilder.toView(lista.getProducto()));
			}

		} catch (Throwable e) {
			log.error("Error al guardar", e);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al realizar la operacion", ""));
		}

	}

	public void prepararAsociarRemitos() {
		this.remitoView = new RemitoView();
	}

	public void addDispatch() {

		try {
			// validar si no existe el numeero de remito
			Long cliente = null;
			if (getUsuario().getCliente() != null) {
				cliente = getUsuario().getCliente().getID();
			}

			RemitoView remitoView = new RemitoView();

			for (OrdenDeCompraDetalleView ordenDeCompraDetalleView : ordenDeCompraView
					.getListaDetalleOrdenDeCompraView()) {
				RemitoDetalleView remitoDetalleView = new RemitoDetalleView();

				remitoDetalleView.setCantidad(ordenDeCompraDetalleView
						.getCantidadRemito());

				// TODO JORGE este código puede no ser numérico. hoy pues
				// ingresar cualquier cosa en el producto y el código del
				// proveedor.
				Long codigo = Long.parseLong(ordenDeCompraDetalleView
						.getCodigoProductoProveedor());
				ProductoCodigo unProductoCodigo = daoProductoCodigo.buscarPor(
						codigo, this.ordenDeCompraView.getProveedorView()
								.getId());
				remitoDetalleView.setProductoCodigoView(productoCodigoBuilder
						.toView(unProductoCodigo));
				remitoView.getDetalleRemitoView().add(remitoDetalleView);

				remitoView.setEstado("INGRESADO");
				remitoView.setFechaRemito(this.remitoView.getFechaRemito());
				remitoView.setNumeroRemito(this.remitoView.getNumeroRemito());
			}
			this.ordenDeCompraView.getListaDeRemitos().add(remitoView);

			this.remitoView.setNumeroRemito(ordenDeCompraView
					.getListaDeRemitos().size() + 1l);

		} catch (Exception e) {
			log.error("Error al actualizar", e);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al realizar la operacion", ""));
		}

	}

	public void aprobarRemito(Long id) {

		try {

			for (RemitoView remitoView : ordenDeCompraView.getListaDeRemitos()) {
				if (id.longValue() == remitoView.getNumeroRemito().longValue()) {
					remitoView.setEstado("APROBADO");
					break;
				}
			}

			boolean estanTodosLosRemitosAprobados = true;
			for (RemitoView remitoView : ordenDeCompraView.getListaDeRemitos()) {
				if (!remitoView.getEstado().equalsIgnoreCase("APROBADO")) {
					estanTodosLosRemitosAprobados = false;
				}
			}

			if (estanTodosLosRemitosAprobados) {
				ordenDeCompraView.setEstado("REMITOS APROBADOS");
			} else {
				ordenDeCompraView.setEstado("FALTA APROBACION DE REMITOS");
			}

			ordenDeCompra = ordenDeCompraBuilder.toDomain(ordenDeCompraView);

			daoOrdenDeCompra.edit(ordenDeCompra);

			bajarElStock();

			JSFUtil.saveMessage("Elemento actualizado con exito",
					FacesMessage.SEVERITY_INFO);

		} catch (Throwable e) {
			log.error("Error al actualizar", e);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al realizar la operacion", ""));
		}

	}

	public void bajarElStock() {
		Long idCliente = null;
		ClienteView unClienteView = ordenDeCompraView.getClienteView();
		if (unClienteView != null) {
			idCliente = unClienteView.getId();
		}

		if (idCliente != null) // esto se hace porque si es central no tiene que
								// bajar el stock
		{
			// ACTUALIZACION DEL STOCK Y SUS MOVIMIENTOS
			Long clienteID = null;
			Usuario usuario = getUsuario();
			if (usuario.getCliente() != null) {
				clienteID = usuario.getCliente().getID();
			}
			for (RemitoView remitoView : ordenDeCompraView.getListaDeRemitos()) {
				Stock unStock = null;
				for (RemitoDetalleView remitoDetalleView : remitoView
						.getDetalleRemitoView()) {
					unStock = daoStock.findBy(clienteID, remitoDetalleView
							.getProductoCodigoView().getProducto().getId(),
							null);
					if (unStock != null) {
						unStock.setCantidad(unStock.getCantidad().doubleValue()
								- remitoDetalleView.getCantidad().doubleValue());
						unStock.setFechaUltimoMovimiento(Calendar.getInstance()
								.getTime());

						MovimientoStock movimientoStock = new MovimientoStock();
						movimientoStock.setCantidad(remitoDetalleView
								.getCantidad().doubleValue() * -1);
						movimientoStock.setDepositoDestino(null);
						movimientoStock.setDepositoOrigen(null);
						movimientoStock.setEstado(EstadoEnum.AUTORIZADO);
						movimientoStock.setFecha(Calendar.getInstance()
								.getTime());
						movimientoStock
								.setObservaciones("Numero de orden de compra "
										+ ordenDeCompraView
												.getNumeroOrdenDeCompra()
										+ ", remito "
										+ remitoView.getNumeroRemito());
						movimientoStock
								.setProducto(productoBuilder
										.toDomain(remitoDetalleView
												.getProductoCodigoView()
												.getProducto()));
						movimientoStock.setStock(unStock);
						movimientoStock.setTipoMovimientoManual(null);
						movimientoStock
								.setTipoMovimientoStock(TipoMovimientoStockEnum.AUTOMATICO);
						movimientoStock.setUsuario(getUsuario());

						unStock.getListaMovimientoStock().add(movimientoStock);

						daoStock.edit(unStock);

					} else {
						Stock stock = new Stock();
						stock.setCantidad(remitoDetalleView.getCantidad()
								.doubleValue() * -1);
						stock.setDeposito(null);
						stock.setFechaDeIngreso(Calendar.getInstance()
								.getTime());
						stock.setFechaUltimoMovimiento(Calendar.getInstance()
								.getTime());
						stock.setProducto(productoBuilder
								.toDomain(remitoDetalleView
										.getProductoCodigoView().getProducto()));
						stock.setProveedor(proveedorBuilder
								.toDomain(remitoDetalleView
										.getProductoCodigoView().getProveedor()));
						stock.setCliente(null);

						MovimientoStock movimientoStock = new MovimientoStock();
						movimientoStock.setCantidad(remitoDetalleView
								.getCantidad() * -1);
						movimientoStock.setDepositoDestino(null);
						movimientoStock.setDepositoOrigen(null);
						movimientoStock.setEstado(EstadoEnum.AUTORIZADO);
						movimientoStock.setFecha(Calendar.getInstance()
								.getTime());
						movimientoStock
								.setObservaciones("Numero de orden de compra "
										+ ordenDeCompraView
												.getNumeroOrdenDeCompra()
										+ ", remito "
										+ remitoView.getNumeroRemito());
						movimientoStock
								.setProducto(productoBuilder
										.toDomain(remitoDetalleView
												.getProductoCodigoView()
												.getProducto()));
						movimientoStock.setStock(stock);
						movimientoStock.setTipoMovimientoManual(null);
						movimientoStock
								.setTipoMovimientoStock(TipoMovimientoStockEnum.AUTOMATICO);
						movimientoStock.setUsuario(getUsuario());

						List<MovimientoStock> listaMovimientoStock = new ArrayList<MovimientoStock>();
						listaMovimientoStock.add(movimientoStock);

						stock.setListaMovimientoStock(listaMovimientoStock);

						daoStock.save(stock);
					}
				}
			}

		}
	}

	public void subirElStock() {
		Long idCliente = null;
		ClienteView unClienteView = ordenDeCompraView.getClienteView();
		if (unClienteView != null) {
			idCliente = unClienteView.getId();
		}

		// ACTUALIZACION DEL STOCK Y SUS MOVIMIENTOS
		Long clienteID = null;
		Usuario usuario = getUsuario();
		if (usuario.getCliente() != null) {
			clienteID = usuario.getCliente().getID();
		}
		for (RemitoView remitoView : ordenDeCompraView.getListaDeRemitos()) {
			if (this.remitoView.getId().longValue() == remitoView.getId()
					.longValue()) {
				Stock unStock = null;
				for (RemitoDetalleView remitoDetalleView : remitoView
						.getDetalleRemitoView()) {
					unStock = daoStock.findBy(clienteID, remitoDetalleView
							.getProductoCodigoView().getProducto().getId(),
							null);
					if (unStock != null) {
						unStock.setCantidad(unStock.getCantidad().doubleValue()
								+ remitoDetalleView.getCantidad().doubleValue());
						unStock.setFechaUltimoMovimiento(Calendar.getInstance()
								.getTime());

						MovimientoStock movimientoStock = new MovimientoStock();
						movimientoStock.setCantidad(remitoDetalleView
								.getCantidad().doubleValue() * 1);
						movimientoStock.setDepositoDestino(null);
						movimientoStock.setDepositoOrigen(null);
						movimientoStock.setEstado(EstadoEnum.AUTORIZADO);
						movimientoStock.setFecha(Calendar.getInstance()
								.getTime());
						movimientoStock
								.setObservaciones("Numero de orden de compra "
										+ ordenDeCompraView
												.getNumeroOrdenDeCompra()
										+ ", remito "
										+ remitoView.getNumeroRemito());
						movimientoStock
								.setProducto(productoBuilder
										.toDomain(remitoDetalleView
												.getProductoCodigoView()
												.getProducto()));
						movimientoStock.setStock(unStock);
						movimientoStock.setTipoMovimientoManual(null);
						movimientoStock
								.setTipoMovimientoStock(TipoMovimientoStockEnum.AUTOMATICO);
						movimientoStock.setUsuario(getUsuario());

						unStock.getListaMovimientoStock().add(movimientoStock);

						daoStock.edit(unStock);

					} else {
						Stock stock = new Stock();
						stock.setCantidad(remitoDetalleView
								.getCantidadRecepcionada());
						stock.setDeposito(null);
						stock.setFechaDeIngreso(Calendar.getInstance()
								.getTime());
						stock.setFechaUltimoMovimiento(Calendar.getInstance()
								.getTime());
						stock.setProducto(productoBuilder
								.toDomain(remitoDetalleView
										.getProductoCodigoView().getProducto()));
						stock.setProveedor(proveedorBuilder
								.toDomain(remitoDetalleView
										.getProductoCodigoView().getProveedor()));

						if (idCliente == null) {
							stock.setCliente(null);
						} else {
							stock.getCliente().setID(idCliente);
						}

						MovimientoStock movimientoStock = new MovimientoStock();
						movimientoStock.setCantidad(remitoDetalleView
								.getCantidad());
						movimientoStock.setDepositoDestino(null);
						movimientoStock.setDepositoOrigen(null);
						movimientoStock.setEstado(EstadoEnum.AUTORIZADO);
						movimientoStock.setFecha(Calendar.getInstance()
								.getTime());
						movimientoStock
								.setObservaciones("Numero de orden de compra "
										+ ordenDeCompraView
												.getNumeroOrdenDeCompra()
										+ ", remito "
										+ remitoView.getNumeroRemito());
						movimientoStock
								.setProducto(productoBuilder
										.toDomain(remitoDetalleView
												.getProductoCodigoView()
												.getProducto()));
						movimientoStock.setStock(stock);
						movimientoStock.setTipoMovimientoManual(null);
						movimientoStock
								.setTipoMovimientoStock(TipoMovimientoStockEnum.AUTOMATICO);
						movimientoStock.setUsuario(getUsuario());

						List<MovimientoStock> listaMovimientoStock = new ArrayList<MovimientoStock>();
						listaMovimientoStock.add(movimientoStock);

						stock.setListaMovimientoStock(listaMovimientoStock);

						daoStock.save(stock);
					}
				}
			}
		}
	}

	public void eliminarLineaDelDetalle(Long id) {
		this.ordenDeCompraDetalle.remove(Long.valueOf(id).intValue());
	}

	public void clear() {
		this.ordenDeCompra = new OrdenDeCompra();
		this.ordenDeCompraView = new OrdenDeCompraView();
		this.productoView = new ProductoView();
		this.listaDeProductos = new ArrayList<ProductoView>();
		this.productoCodigoView = new ProductoCodigoView();
		total = BigDecimal.ZERO;
		totalRecepcionado = BigDecimal.ZERO;

	}

	public void recepcion(Long id, String disabled) {

		addEdit = false;
		this.disabled = disabled;
		addEditDispatch = false;
		addEditRecepcion = true;
		info = false;
		list = false;

		try {

			ordenDeCompraView = ordenDeCompraBuilder.toView(daoOrdenDeCompra
					.findInitialize(id));

		} catch (Throwable e) {
			log.error("Error al guardar", e);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al realizar la operacion", ""));
		}

	}

	public void prepararRecepcion(Long idNumeroRemito) {
		try {
			for (RemitoView remitoView : this.ordenDeCompraView
					.getListaDeRemitos()) {
				if (remitoView.getId().longValue() == idNumeroRemito
						.longValue()) {
					this.remitoView = remitoView;
					// coloco la fecha de recepción
					remitoView.setFechaRecepcion(DateUtil
							.getFirstTime(new Date()));
					break;
				}

			}

		} catch (Exception e) {
			log.error("Error al actualizar", e);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al realizar la operacion", ""));
		}

	}

	public void asociarRecepcionAlRemito() {
		try {

			BigDecimal totalRecepcionado = BigDecimal.ZERO;

			// tarifario vigente para la fecha de la OC
			TarifarioQuery tarifarioQuery = new TarifarioQuery(null,
					TipoTarifarioEnum.PROVEEDOR, null, null, ordenDeCompraView
							.getProveedorView().getId(), false,
					ordenDeCompraView.getFechaOrdenDeCompra());
			List<Tarifario> listaTarifario = daoTarifario
					.getList(tarifarioQuery);
			if (listaTarifario.size() > 0) {
				Tarifario tarifario = listaTarifario.get(0);
				tarifario = daoTarifario.findFULL(tarifario.getID());
				tarifarioView = tarifarioBuilder.toView(tarifario);
			} else {
				throw new Exception(
						"No hay tarifario vigente para el proveedor "
								+ ordenDeCompraView.getProveedorView().getId()
								+ "-"
								+ ordenDeCompraView.getProveedorView()
										.getNombre() + " para la fecha "
								+ ordenDeCompraView.getFechaOrdenDeCompra());
			}

			remitoView.setEstado("RECEPCIONADO");

			boolean estanTodosLosRemitosAprobados = true;
			for (RemitoView remitoView : ordenDeCompraView.getListaDeRemitos()) {
				if (!remitoView.getEstado().equalsIgnoreCase("RECEPCIONADO")) {
					estanTodosLosRemitosAprobados = false;
				}
				// recorro los remitos y veo que se recepcionó para actualizar
				// el total realmente recepcionado.
				// calculo el total recepcionado
				for (RemitoDetalleView rdv : remitoView.getDetalleRemitoView()) {
					for (ProductoPrecioView productoPrecio : tarifarioView
							.getListaProductoPrecio()) {
						if (productoPrecio.getProducto().getId().longValue() == rdv
								.getProductoCodigoView().getProducto().getId()
								.longValue()) {
							if (rdv.getCantidadRecepcionada() != null
									&& rdv.getCantidadRecepcionada() > 0) {
								totalRecepcionado = totalRecepcionado
										.add(productoPrecio
												.getPrecio()
												.multiply(
														new BigDecimal(
																rdv.getCantidadRecepcionada())));
							}
						}
					}
				}
			}

			// Coloco el total recepcionado en la orden de compra
			ordenDeCompraView.setTotalRecepcionado(totalRecepcionado);

			if (estanTodosLosRemitosAprobados) {
				ordenDeCompraView.setEstado("REMITOS RECEPCIONADOS");
			} else {
				ordenDeCompraView.setEstado("FALTA RECEPCION DE REMITOS");
			}

			ordenDeCompra = ordenDeCompraBuilder.toDomain(ordenDeCompraView);

			daoOrdenDeCompra.edit(ordenDeCompra);

			subirElStock();

			JSFUtil.saveMessage("Elemento actualizado con exito",
					FacesMessage.SEVERITY_INFO);
			if (!addEdit) {
				loadList();
			}

		} catch (Throwable e) {
			log.error("Error al actualizar", e);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al realizar la operacion", ""));
		}

	}

	public void aprobarRecepcion(Long numeroDeRemito) {

		for (RemitoView remitoView : ordenDeCompraView.getListaDeRemitos()) {
			if (remitoView.getNumeroRemito().longValue() == numeroDeRemito
					.longValue()) {
				remitoView.setEstado("RECEPCIONADO");
			}
		}
	}

	public void grabarRecepcion() {

		try {

			ordenDeCompra = ordenDeCompraBuilder.toDomain(ordenDeCompraView);

			daoOrdenDeCompra.edit(ordenDeCompra);
			addEdit = false;
			addEditDispatch = false;
			addEditRecepcion = false;
			info = false;
			list = true;

			JSFUtil.saveMessage("Elemento actualizado con exito",
					FacesMessage.SEVERITY_INFO);
			if (!addEdit) {
				loadList();
			}

		} catch (Throwable e) {
			log.error("Error al actualizar", e);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al realizar la operacion", ""));
		}

	}

	public void actualizarListaDeProductos(ValueChangeEvent event) {
		Long idProveedor = (Long) event.getNewValue();
		listaDeProductos = new ArrayList<ProductoView>();

		// borro si hay un producto seleccionado
		this.productoView = new ProductoView();
		this.productoCodigoView = new ProductoCodigoView();
		this.productoPrecio = new ProductoPrecioView();
		this.stockView = new StockView();
		this.totalCargaProducto = 0D;

		// TODO PABLO tiene que traer los productos con precio del proveedor.
		Proveedor unProveedor = daoProveedor.findInitialize(idProveedor);

		for (ProductoCodigo lista : unProveedor.getListaProductoCodigo()) {
			listaDeProductos.add(productoBuilder.toView(lista.getProducto()));
		}
	}

	public void actualizarListaDeProductosFamiliaMarca() {
		List<ProductoView> listaDeProductosAuxiliares = new ArrayList<ProductoView>();

		// borro si hay un producto seleccionado
		this.productoView = new ProductoView();
		this.productoCodigoView = new ProductoCodigoView();
		this.productoPrecio = new ProductoPrecioView();
		this.stockView = new StockView();
		this.totalCargaProducto = 0D;

		// Recargo los productos del proveedor por si ya había elegido una
		// familia o marca
		Proveedor unProveedor = daoProveedor.findInitialize(ordenDeCompraView
				.getProveedorView().getId());

		listaDeProductos.clear();
		for (ProductoCodigo lista : unProveedor.getListaProductoCodigo()) {
			listaDeProductos.add(productoBuilder.toView(lista.getProducto()));
		}

		if (marcaSeleccionada.getId() != null
				|| familiaSeleccionada.getId() != null) {

			for (ProductoView producto : listaDeProductos) {
				if (marcaSeleccionada.getId() != null
						&& familiaSeleccionada.getId() != null) {
					if (producto.getMarca().getId() == marcaSeleccionada
							.getId()
							&& producto.getFamilia().getId() == familiaSeleccionada
									.getId()) {
						listaDeProductosAuxiliares.add(producto);
					}
				} else if (marcaSeleccionada.getId() != null
						&& producto.getMarca().getId() == marcaSeleccionada
								.getId()
						|| familiaSeleccionada.getId() != null
						&& producto.getFamilia().getId() == familiaSeleccionada
								.getId()) {
					listaDeProductosAuxiliares.add(producto);
				}
			}

			listaDeProductos.clear();
			listaDeProductos.addAll(listaDeProductosAuxiliares);
		}

	}

	public void buscarProductoSeleccionadoParaOC(ValueChangeEvent event) {

		try {
			this.productoPrecio = new ProductoPrecioView();

			Long idProducto = (Long) event.getNewValue();
			Long idProveedor = ordenDeCompraView.getProveedorView().getId();

			productoCodigoView = productoCodigoBuilder.toView(daoProductoCodigo
					.findBy(idProducto, idProveedor));

			productoView = productoBuilder.toView(daoProducto.find(idProducto));

			// tarifario vigente para la fecha de la OC
			TarifarioQuery tarifarioQuery = new TarifarioQuery(null,
					TipoTarifarioEnum.PROVEEDOR, null, null, ordenDeCompraView
							.getProveedorView().getId(), false,
					ordenDeCompraView.getFechaOrdenDeCompra());
			List<Tarifario> listaTarifario = daoTarifario
					.getList(tarifarioQuery);
			if (listaTarifario.size() > 0) {
				Tarifario tarifario = listaTarifario.get(0);
				tarifario = daoTarifario.findFULL(tarifario.getID());
				tarifarioView = tarifarioBuilder.toView(tarifario);
			} else {
				throw new Exception(
						"No hay tarifario vigente para el proveedor "
								+ ordenDeCompraView.getProveedorView().getId()
								+ "-"
								+ ordenDeCompraView.getProveedorView()
										.getNombre() + " para la fecha "
								+ ordenDeCompraView.getFechaOrdenDeCompra());
			}

			for (ProductoPrecioView productoPrecio : tarifarioView
					.getListaProductoPrecio()) {
				if (productoPrecio.getProducto().getId().longValue() == idProducto
						.longValue()) {
					this.productoPrecio = productoPrecio;
					break;
				}
			}

			if (this.productoPrecio.getPrecio() == null) {
				FacesContext
						.getCurrentInstance()
						.addMessage(
								null,
								new FacesMessage(
										FacesMessage.SEVERITY_ERROR,
										"No se puede seleccionar el producto por no tener un precio vigente. Puede colocarle un precio en la administración de tarifarios",
										""));

			} else {
				stockCantidad = obtenerStockDeUnProducto(idProducto);
			}

		} catch (Throwable e) {
			log.error("Error al actualizar", e);
			FacesContext
					.getCurrentInstance()
					.addMessage(
							null,
							new FacesMessage(
									FacesMessage.SEVERITY_ERROR,
									"No se puede seleccionar el producto por no tener un precio vigente. Puede colocarle un precio en con la administración de tarifarios",
									""));
		}

	}

	public double obtenerStockDeUnProducto(Long idProducto) {
		double retorno = 0D;
		Long idCliente = null;
		Usuario usuario = getUsuario();
		if (usuario.getCliente() != null) {
			idCliente = usuario.getCliente().getID();
		}

		Stock unStock = daoStock.findBy(idCliente, idProducto, null);
		if (unStock != null) {
			retorno = unStock.getCantidad();
		} else {
			retorno = 0D;
			stockView.setCantidad(0D);
		}
		return retorno;
	}

	public void addProductToPurchaseOrder(ActionEvent event) {

		OrdenDeCompraDetalleView unaOrdenDeCompraDetalle = new OrdenDeCompraDetalleView();
		unaOrdenDeCompraDetalle.setCantidad(totalCargaProducto);
		unaOrdenDeCompraDetalle.setCodigoProductoProveedor(productoCodigoView
				.getCodigoProveedor());
		unaOrdenDeCompraDetalle.setPrecio(productoPrecio.getPrecio());
		unaOrdenDeCompraDetalle.setProductoView(productoView);

		if (this.ordenDeCompraDetalle == null) {
			this.ordenDeCompraDetalle = new ArrayList<OrdenDeCompraDetalleView>();
		}

		this.ordenDeCompraDetalle.add(unaOrdenDeCompraDetalle);

		this.productoView = new ProductoView();
		this.productoCodigoView = new ProductoCodigoView();
		this.productoPrecio = new ProductoPrecioView();
		this.stockView = new StockView();
		this.totalCargaProducto = 0D;

	}

	public BigDecimal totalLinePurchaseOrder(BigDecimal cantidad,
			BigDecimal precio) {

		return precio.multiply(cantidad);

	}

	public Double getGranTotalCantidad() {
		Double retorno = 0D;
		if (this.ordenDeCompraDetalle != null) {
			for (OrdenDeCompraDetalleView ocd : this.ordenDeCompraDetalle) {
				retorno = retorno + ocd.getCantidad();
			}
		}
		return retorno;
	}

	@SuppressWarnings("null")
	public BigDecimal getGranTotalPrecio() {
		BigDecimal suma = BigDecimal.ZERO;
		BigDecimal valor = BigDecimal.ZERO;
		if (this.ordenDeCompraDetalle != null) {
			for (OrdenDeCompraDetalleView ocd : this.ordenDeCompraDetalle) {
				valor = ocd.getPrecio().multiply(
						BigDecimal.valueOf(ocd.getCantidad()));
				suma = suma.add(valor);
			}
		}
		return suma.setScale(2);
	}

	@SuppressWarnings("rawtypes")
	private void loadList() {

		lazyDM = new LazyDataModel<OrdenDeCompra>() {
			@Override
			public List<OrdenDeCompra> load(int first, int pageSize,
					String sortField, SortOrder sortOrder,
					Map<String, Object> filters) {

				Map<String, Object> filtro = new HashMap<String, Object>();

				filtro.put("numeroOrdenDeCompra",
						ordenDeCompraQuery.getNumeroOrdenDeCompra());
				filtro.put("proveedor.id", ordenDeCompraQuery.getProveedorID());
				filtro.put("cliente.id", ordenDeCompraQuery.getClienteID());
				// mando un Restriction armado como filtro
				if (ordenDeCompraQuery.getFechaDesde() != null
						&& ordenDeCompraQuery.getFechaHasta() != null) {
					filtro.put("fecha", Restrictions.and(Restrictions.ge(
							"fechaOrdenDeCompra",
							ordenDeCompraQuery.getFechaDesde()), Restrictions
							.le("fechaOrdenDeCompra",
									ordenDeCompraQuery.getFechaHasta())));
				} else if (ordenDeCompraQuery.getFechaDesde() != null) {
					filtro.put("fecha", Restrictions.ge("fechaOrdenDeCompra",
							ordenDeCompraQuery.getFechaDesde()));
				} else if (ordenDeCompraQuery.getFechaHasta() != null) {
					filtro.put("fecha", Restrictions.le("fechaOrdenDeCompra",
							ordenDeCompraQuery.getFechaHasta()));
				}

				return daoOrdenDeCompra.getList(first, pageSize, "id", false,
						filtro, true);
			}
		};

		Map<String, Object> filtro = new HashMap<String, Object>();
		filtro.put("numeroOrdenDeCompra",
				ordenDeCompraQuery.getNumeroOrdenDeCompra());
		filtro.put("proveedor.id", ordenDeCompraQuery.getProveedorID());
		filtro.put("cliente.id", ordenDeCompraQuery.getClienteID());
		// mando un Restriction armado como filtro
		if (ordenDeCompraQuery.getFechaDesde() != null
				&& ordenDeCompraQuery.getFechaHasta() != null) {
			filtro.put("fecha", Restrictions.and(
					Restrictions.ge("fechaOrdenDeCompra",
							ordenDeCompraQuery.getFechaDesde()),
					Restrictions.le("fechaOrdenDeCompra",
							ordenDeCompraQuery.getFechaHasta())));
		} else if (ordenDeCompraQuery.getFechaDesde() != null) {
			filtro.put(
					"fecha",
					Restrictions.ge("fechaOrdenDeCompra",
							ordenDeCompraQuery.getFechaDesde()));
		} else if (ordenDeCompraQuery.getFechaHasta() != null) {
			filtro.put(
					"fecha",
					Restrictions.le("fechaOrdenDeCompra",
							ordenDeCompraQuery.getFechaHasta()));
		}

		lazyDM.setRowCount(daoOrdenDeCompra.count(filtro, true).intValue());

		// sumo los totales
		List totales = daoOrdenDeCompra.sum(filtro, true, "total",
				"totalRecepcionado");
		Object[] objeto = (Object[]) totales.get(0);

		total = BigDecimal.ZERO;
		totalRecepcionado = BigDecimal.ZERO;

		if (objeto.length >= 1 && objeto[0] != null) {
			total = new BigDecimal(objeto[0].toString());
		}

		if (objeto.length > 1 && objeto[1] != null) {
			totalRecepcionado = new BigDecimal(objeto[1].toString());
		}
	}

	@SuppressWarnings({ "rawtypes", "unchecked", "deprecation" })
	public void printRemito(Long remitoId) {

		try {

			HttpServletResponse response = (HttpServletResponse) FacesContext
					.getCurrentInstance().getExternalContext().getResponse();
			ServletContext sc = (ServletContext) FacesContext
					.getCurrentInstance().getExternalContext().getContext();
			String pathReal = sc.getRealPath("/");
			File file = new File(pathReal + File.separator
					+ "resources\\reports\\Remito.jasper");

			JasperReport jasperReport = (JasperReport) JRLoader
					.loadObject(file);

			// parametros
			Map parameters = new HashMap();
			parameters.put("idRemito", remitoId);
			parameters.put("imagenLogo", pathReal + File.separator
					+ "resources\\images\\logo.jpg");

			// datos de la empresa ( están configurados en la pantalla de
			// parámetros
			String empresaParametro = "";
			try {
				empresaParametro = daoParametro.get(empresa).getValor();
			} catch (Throwable t) {
			}

			String direccionEmpresaParametro = "";
			try {
				direccionEmpresaParametro = daoParametro.get(direccionEmpresa)
						.getValor();
			} catch (Throwable t) {
			}

			String localidadEmpresaParametro = "";
			try {
				localidadEmpresaParametro = daoParametro.get(localidadEmpresa)
						.getValor();
			} catch (Throwable t) {
			}

			String telefonoEmpresaParametro = "";
			try {
				telefonoEmpresaParametro = daoParametro.get(telefonoEmpresa)
						.getValor();
			} catch (Throwable t) {
			}

			parameters.put("empresa", empresaParametro);
			parameters.put("direccion", direccionEmpresaParametro);
			parameters.put("localidad", localidadEmpresaParametro);
			parameters.put("telefono", telefonoEmpresaParametro);

			SessionFactoryImpl objetc = (SessionFactoryImpl) FacesContextUtils
					.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("sessionFactory");

			JasperPrint print = JasperFillManager.fillReport(jasperReport,
					parameters, objetc.getJdbcServices()
							.getConnectionProvider().getConnection());

			response.setContentType("application/pdf");
			response.addHeader("Content-Disposition",
					"attachment; filename=Remito.pdf");

			JasperExportManager.exportReportToPdfStream(print,
					response.getOutputStream());

			FacesContext.getCurrentInstance().responseComplete();
		} catch (Throwable e) {
			log.error("Error al exportar el remito a PDF: ", e);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al exportar el remito", ""));
		}

	}

	public Logger getLog() {
		return log;
	}

	public void setLog(Logger log) {
		this.log = log;
	}

	public List<ProveedorView> getListaDeProveedores() {
		return listaDeProveedores;
	}

	public void setListaDeProveedores(List<ProveedorView> listaDeProveedores) {
		this.listaDeProveedores = listaDeProveedores;
	}

	public BaseModelDAO<Proveedor> getDaoProveedor() {
		return daoProveedor;
	}

	public void setDaoProveedor(BaseModelDAO<Proveedor> daoProveedor) {
		this.daoProveedor = daoProveedor;
	}

	public ProveedorView getProveedorView() {
		return proveedorView;
	}

	public void setProveedorView(ProveedorView proveedorView) {
		this.proveedorView = proveedorView;
	}

	public ProveedorBuilder getProveedorBuilder() {
		return proveedorBuilder;
	}

	public void setProveedorBuilder(ProveedorBuilder proveedorBuilder) {
		this.proveedorBuilder = proveedorBuilder;
	}

	public BaseModelDAO<OrdenDeCompra> getDao() {
		return daoOrdenDeCompra;
	}

	public void setDao(BaseModelDAO<OrdenDeCompra> dao) {
		this.daoOrdenDeCompra = dao;
	}

	public OrdenDeCompra getOrdenDeCompra() {
		return ordenDeCompra;
	}

	public void setOrdenDeCompra(OrdenDeCompra ordenDeCompra) {
		this.ordenDeCompra = ordenDeCompra;
	}

	public OrdenDeCompraQuery getOrdenDeCompraQuery() {
		return ordenDeCompraQuery;
	}

	public void setOrdenDeCompraQuery(OrdenDeCompraQuery ordenDeCompraQuery) {
		this.ordenDeCompraQuery = ordenDeCompraQuery;
	}

	public OrdenDeCompraView getOrdenDeCompraView() {
		return ordenDeCompraView;
	}

	public void setOrdenDeCompraView(OrdenDeCompraView ordenDeCompraView) {
		this.ordenDeCompraView = ordenDeCompraView;
	}

	public ProductoView getProductoView() {
		return productoView;
	}

	public void setProductoView(ProductoView productoView) {
		this.productoView = productoView;
	}

	public List<ProductoView> getListaDeProductos() {
		return listaDeProductos;
	}

	public void setListaDeProductos(List<ProductoView> listaDeProductos) {
		this.listaDeProductos = listaDeProductos;
	}

	public ProductoBuilder getProductoBuilder() {
		return productoBuilder;
	}

	public void setProductoBuilder(ProductoBuilder productoBuilder) {
		this.productoBuilder = productoBuilder;
	}

	public BaseModelDAO<ProductoCodigo> getDaoProductoCodigo() {
		return daoProductoCodigo;
	}

	public void setDaoProductoCodigo(
			BaseModelDAO<ProductoCodigo> daoProductoCodigo) {
		this.daoProductoCodigo = daoProductoCodigo;
	}

	public ProductoCodigoView getProductoCodigoView() {
		return productoCodigoView;
	}

	public void setProductoCodigoView(ProductoCodigoView productoCodigoView) {
		this.productoCodigoView = productoCodigoView;
	}

	public Producto getProdcutoView() {
		return prodcutoView;
	}

	public void setProdcutoView(Producto prodcutoView) {
		this.prodcutoView = prodcutoView;
	}

	public BaseModelDAO<Producto> getDaoProducto() {
		return daoProducto;
	}

	public void setDaoProducto(BaseModelDAO<Producto> daoProducto) {
		this.daoProducto = daoProducto;
	}

	public ProductoCodigoBuilder getProductoCodigoBuilder() {
		return productoCodigoBuilder;
	}

	public void setProductoCodigoBuilder(
			ProductoCodigoBuilder productoCodigoBuilder) {
		this.productoCodigoBuilder = productoCodigoBuilder;
	}

	public TarifarioView getTarifarioView() {
		return tarifarioView;
	}

	public void setTarifarioView(TarifarioView tarifarioView) {
		this.tarifarioView = tarifarioView;
	}

	public BaseModelDAO<Tarifario> getDaoTarifario() {
		return daoTarifario;
	}

	public void setDaoTarifario(BaseModelDAO<Tarifario> daoTarifario) {
		this.daoTarifario = daoTarifario;
	}

	public TarifarioBuilder getTarifarioBuilder() {
		return tarifarioBuilder;
	}

	public void setTarifarioBuilder(TarifarioBuilder tarifarioBuilder) {
		this.tarifarioBuilder = tarifarioBuilder;
	}

	public ProductoPrecioView getProductoPrecio() {
		return productoPrecio;
	}

	public void setProductoPrecio(ProductoPrecioView productoPrecio) {
		this.productoPrecio = productoPrecio;
	}

	public StockView getStockView() {
		return stockView;
	}

	public void setStockView(StockView stockView) {
		this.stockView = stockView;
	}

	public BaseModelDAO<Stock> getDaoStock() {
		return daoStock;
	}

	public void setDaoStock(BaseModelDAO<Stock> daoStock) {
		this.daoStock = daoStock;
	}

	public StockBuilder getStockBuilder() {
		return stockBuilder;
	}

	public MailServiceImpl getMailService() {
		return mailService;
	}

	public void setMailService(MailServiceImpl mailService) {
		this.mailService = mailService;
	}

	public void setStockBuilder(StockBuilder stockBuilder) {
		this.stockBuilder = stockBuilder;
	}

	public Double getTotalCargaProducto() {
		return totalCargaProducto;
	}

	public void setTotalCargaProducto(Double totalCargaProducto) {
		this.totalCargaProducto = totalCargaProducto;
	}

	public List<OrdenDeCompraDetalleView> getOrdenDeCompraDetalle() {
		return ordenDeCompraDetalle;
	}

	public void setOrdenDeCompraDetalle(
			List<OrdenDeCompraDetalleView> ordenDeCompraDetalle) {
		this.ordenDeCompraDetalle = ordenDeCompraDetalle;
	}

	public OrdenDeCompraBuilder getOrdenDeCompraBuilder() {
		return ordenDeCompraBuilder;
	}

	public void setOrdenDeCompraBuilder(
			OrdenDeCompraBuilder ordenDeCompraBuilder) {
		this.ordenDeCompraBuilder = ordenDeCompraBuilder;
	}

	public OrdenDeCompraDetalleBuilder getOrdenDeCompraDetalleBuilder() {
		return ordenDeCompraDetalleBuilder;
	}

	public void setOrdenDeCompraDetalleBuilder(
			OrdenDeCompraDetalleBuilder ordenDeCompraDetalleBuilder) {
		this.ordenDeCompraDetalleBuilder = ordenDeCompraDetalleBuilder;
	}

	@Override
	public void edit(ActionEvent event) {
		// TODO Auto-generated method stub

	}

	public String getLabelButtonAddUpdate() {
		return labelButtonAddUpdate;
	}

	public void setLabelButtonAddUpdate(String labelButtonAddUpdate) {
		this.labelButtonAddUpdate = labelButtonAddUpdate;
	}

	public String getDisabled() {
		return disabled;
	}

	public void setDisabled(String disabled) {
		this.disabled = disabled;
	}

	public RemitoBuilder getRemitoBuilder() {
		return remitoBuilder;
	}

	public void setRemitoBuilder(RemitoBuilder remitoBuilder) {
		this.remitoBuilder = remitoBuilder;
	}

	public boolean isAddEditDispatch() {
		return addEditDispatch;
	}

	public void setAddEditDispatch(boolean addEditDispatch) {
		this.addEditDispatch = addEditDispatch;
	}

	public RemitoView getRemitoView() {
		return remitoView;
	}

	public void setRemitoView(RemitoView remitoView) {
		this.remitoView = remitoView;
	}

	public BaseModelDAO<Parametro> getDaoParametro() {
		return daoParametro;
	}

	public void setDaoParametro(BaseModelDAO<Parametro> daoParametro) {
		this.daoParametro = daoParametro;
	}

	public UsuarioView getUsuarioView() {
		return usuarioView;
	}

	public void setUsuarioView(UsuarioView usuarioView) {
		this.usuarioView = usuarioView;
	}

	public UsuarioBuilder getUsuarioBuilder() {
		return usuarioBuilder;
	}

	public void setUsuarioBuilder(UsuarioBuilder usuarioBuilder) {
		this.usuarioBuilder = usuarioBuilder;
	}

	public ClienteBuilder getClienteBuilder() {
		return clienteBuilder;
	}

	public void setClienteBuilder(ClienteBuilder clienteBuilder) {
		this.clienteBuilder = clienteBuilder;
	}

	public boolean isAddEditRecepcion() {
		return addEditRecepcion;
	}

	public void setAddEditRecepcion(boolean addEditRecepcion) {
		this.addEditRecepcion = addEditRecepcion;
	}

	public boolean isInfo() {
		return info;
	}

	public void setInfo(boolean info) {
		this.info = info;
	}

	public boolean isList() {
		return list;
	}

	public void setList(boolean list) {
		this.list = list;
	}

	public Double getStockCantidad() {
		return stockCantidad;
	}

	public void setStockCantidad(Double stockCantidad) {
		this.stockCantidad = stockCantidad;
	}

	public String getIdSeleccionado() {
		return idSeleccionado;
	}

	public void setIdSeleccionado(String idSeleccionado) {
		this.idSeleccionado = idSeleccionado;
	}

	@Override
	public void delete(ActionEvent event) {
		// TODO Auto-generated method stub

	}

	public FamiliaBuilder getFamiliaBuilder() {
		return familiaBuilder;
	}

	public void setFamiliaBuilder(FamiliaBuilder familiaBuilder) {
		this.familiaBuilder = familiaBuilder;
	}

	public MarcaBuilder getMarcaBuilder() {
		return marcaBuilder;
	}

	public void setMarcaBuilder(MarcaBuilder marcaBuilder) {
		this.marcaBuilder = marcaBuilder;
	}

	public List<FamiliaView> getListaDeFamilia() {
		return listaDeFamilia;
	}

	public List<MarcaView> getListaDeMarca() {
		return listaDeMarca;
	}

	public FamiliaView getFamiliaSeleccionada() {
		return familiaSeleccionada;
	}

	public MarcaView getMarcaSeleccionada() {
		return marcaSeleccionada;
	}

	public List<ClienteView> getListaDeClientes() {
		return listaDeClientes;
	}

	public BigDecimal getTotal() {
		return total;
	}

	public BigDecimal getTotalRecepcionado() {
		return totalRecepcionado;
	}

}
